package org.tmsps.ne4spring.utils.img;

import org.apache.commons.lang3.StringUtils;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.awt.image.CropImageFilter;
import java.awt.image.FilteredImageSource;
import java.awt.image.ImageFilter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class ImgTools {

	/**
	 * 按照 宽高 比例压缩
	 * 
	 * @param img
	 * @param width
	 * @param height
	 * @param out
	 * @throws IOException
	 */
	public static void thumbnail_w_h(File img, int width, int height, OutputStream out) throws IOException {
		BufferedImage bi = ImageIO.read(img);
		//System.out.println(5);
		double srcWidth = bi.getWidth(); // 源图宽度
		double srcHeight = bi.getHeight(); // 源图高度

		double scale = 1;

		if (width > 0) {
			scale = width / srcWidth;
		}
		if (height > 0) {
			scale = height / srcHeight;
		}
		if (width > 0 && height > 0) {
			scale = height / srcHeight < width / srcWidth ? height / srcHeight : width / srcWidth;
		}
		//System.out.println(6);
		thumbnail(img, (int) (srcWidth * scale), (int) (srcHeight * scale), out);
		//System.out.println(7);
	}

	/**
	 * 按照固定宽高原图压缩
	 * 
	 * @param img
	 * @param width
	 * @param height
	 * @param out
	 * @throws IOException
	 */
	public static void thumbnail(File img, int width, int height, OutputStream out) throws IOException {
		BufferedImage BI = ImageIO.read(img);
		Image image = BI.getScaledInstance(width, height, Image.SCALE_SMOOTH);
		BufferedImage tag = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
		Graphics g = tag.getGraphics();
		g.drawImage(image, 0, 0, null); // 绘制处理后的图
		g.dispose();
		ImageIO.write(tag, "JPEG", out);
	}

	/**
	 * 按照宽高裁剪
	 * 
	 * @param srcImageFile
	 * @param destWidth
	 * @param destHeight
	 * @param out
	 */
	public static void cut_w_h(File srcImageFile, int destWidth, int destHeight, OutputStream out) {
		cut_w_h(srcImageFile, 0, 0, destWidth, destHeight, out);
	}

	public static void cut_w_h(File srcImageFile, int x, int y, int destWidth, int destHeight, OutputStream out) {
		try {
			Image img;
			ImageFilter cropFilter;
			// 读取源图像
			BufferedImage bi = ImageIO.read(srcImageFile);
			int srcWidth = bi.getWidth(); // 源图宽度
			int srcHeight = bi.getHeight(); // 源图高度

			if (srcWidth >= destWidth && srcHeight >= destHeight) {
				Image image = bi.getScaledInstance(srcWidth, srcHeight, Image.SCALE_DEFAULT);

				cropFilter = new CropImageFilter(x, y, destWidth, destHeight);
				img = Toolkit.getDefaultToolkit().createImage(new FilteredImageSource(image.getSource(), cropFilter));
				BufferedImage tag = new BufferedImage(destWidth, destHeight, BufferedImage.TYPE_INT_RGB);
				Graphics g = tag.getGraphics();
				g.drawImage(img, 0, 0, null); // 绘制截取后的图
				g.dispose();
				// 输出为文件
				ImageIO.write(tag, "JPEG", out);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}// #cut_w_h

	/**
     * 按指定高度 等比例缩放图片
     * 
     * @param imageFile
     * @param newPath
     * @param newWidth 新图的宽度
     * @throws IOException
     */
    public static void zoomImageScale(File imageFile, int width, int height,OutputStream out) throws IOException {
    	BufferedImage bi = ImageIO.read(imageFile);
		System.out.println(5);
		double srcWidth = bi.getWidth(); // 源图宽度
		double srcHeight = bi.getHeight(); // 源图高度

		double scale = 1;

		if (width > 0) {
			scale = width / srcWidth;
		}
		if (height > 0) {
			scale = height / srcHeight;
		}
		if (width > 0 && height > 0) {
			scale = height / srcHeight < width / srcWidth ? height / srcHeight : width / srcWidth;
		}
        int newHeight =  (int)(srcHeight / scale);
        int newWidth =  (int)(srcWidth / scale);
        zoomImageUtils(imageFile, out, bi, newWidth, newHeight);
    }

    private static void zoomImageUtils(File imageFile, OutputStream out, BufferedImage bufferedImage, int width, int height)
            throws IOException{
        
         String suffix = StringUtils.substringAfterLast(imageFile.getName(), ".");
        
         // 处理 png 背景变黑的问题
        if(suffix != null && (suffix.trim().toLowerCase().endsWith("png") || suffix.trim().toLowerCase().endsWith("gif"))){
            BufferedImage to= new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); 
            Graphics2D g2d = to.createGraphics(); 
            to = g2d.getDeviceConfiguration().createCompatibleImage(width, height, Transparency.TRANSLUCENT); 
            g2d.dispose(); 
            
            g2d = to.createGraphics(); 
            Image from = bufferedImage.getScaledInstance(width, height, Image.SCALE_AREA_AVERAGING); 
            g2d.drawImage(from, 0, 0, null);
            g2d.dispose(); 
            
            ImageIO.write(to, suffix, out);
        }else{
            // 高质量压缩，其实对清晰度而言没有太多的帮助
//            BufferedImage tag = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
//            tag.getGraphics().drawImage(bufferedImage, 0, 0, width, height, null);
//
//            FileOutputStream out = new FileOutputStream(newPath);    // 将图片写入 newPath
//            JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
//            JPEGEncodeParam jep = JPEGCodec.getDefaultJPEGEncodeParam(tag);
//            jep.setQuality(1f, true);    //压缩质量, 1 是最高值
//            encoder.encode(tag, jep);
//            out.close();
            
            BufferedImage newImage = new BufferedImage(width, height, bufferedImage.getType());
            Graphics g = newImage.getGraphics();
            g.drawImage(bufferedImage, 0, 0, width, height, null);
            g.dispose();
            ImageIO.write(newImage, suffix, out);
        }
    }
    
    
	public static void main(String[] args) throws IOException {
		File img = new File("F:\\图片\\5a489ce2N04f65ac4.jpg");
		FileOutputStream fos = new FileOutputStream(img);
		ImgTools.thumbnail(img, 100, 100, fos);
		// ImgTools.cut_w_h(img, 230, 200, fos);
		System.out.println(fos);
		ImgTools.thumbnail_w_h(img, 100, 0, fos);
	}

}
